home *** CD-ROM | disk | FTP | other *** search
/ Aminet 24 / Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso / Aminet / comm / mail / Mutt089src.lha / Mutt-0.89i-AMIGA / src / main.c < prev    next >
C/C++ Source or Header  |  1998-01-28  |  13KB  |  617 lines

  1. /*
  2.  * Copyright (C) 1996-8 Michael R. Elkins <me@cs.hmc.edu>
  3.  * 
  4.  *     This program is free software; you can redistribute it and/or modify
  5.  *     it under the terms of the GNU General Public License as published by
  6.  *     the Free Software Foundation; either version 2 of the License, or
  7.  *     (at your option) any later version.
  8.  * 
  9.  *     This program is distributed in the hope that it will be useful,
  10.  *     but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  *     GNU General Public License for more details.
  13.  * 
  14.  *     You should have received a copy of the GNU General Public License
  15.  *     along with this program; if not, write to the Free Software
  16.  *     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  */ 
  18.  
  19. #define MAIN_C 1
  20.  
  21. #include "mutt.h"
  22. #include "mutt_curses.h"
  23. #include "keymap.h"
  24. #include "mailbox.h"
  25. #include "send.h"
  26. #include "parse.h"
  27.  
  28. #include <string.h>
  29. #include <stdlib.h>
  30. #include <locale.h>
  31. #include <unistd.h>
  32. #include <errno.h>
  33. #include <sys/stat.h>
  34. #include <sys/utsname.h>
  35.  
  36. const char Notice[] = "\
  37. Copyright (C) 1996-8 Michael R. Elkins <me@cs.hmc.edu>\n\
  38. Mutt comes with ABSOLUTELY NO WARRANTY; for details type `mutt -vv'.\n\
  39. Mutt is free software, and you are welcome to redistribute it\n\
  40. under certain conditions; type `mutt -vv' for details.\n";
  41.  
  42. const char Copyright[] = "\
  43. Copyright (C) 1996-8 Michael R. Elkins <me@cs.hmc.edu>\n\
  44. \n\
  45.     This program is free software; you can redistribute it and/or modify\n\
  46.     it under the terms of the GNU General Public License as published by\n\
  47.     the Free Software Foundation; either version 2 of the License, or\n\
  48.     (at your option) any later version.\n\
  49. \n\
  50.     This program is distributed in the hope that it will be useful,\n\
  51.     but WITHOUT ANY WARRANTY; without even the implied warranty of\n\
  52.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\
  53.     GNU General Public License for more details.\n\
  54. \n\
  55.     You should have received a copy of the GNU General Public License\n\
  56.     along with this program; if not, write to the Free Software\n\
  57.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n";
  58.  
  59. void mutt_exit (int code)
  60. {
  61.   mutt_endwin (NULL);
  62.   exit (code);
  63. }
  64.  
  65. static void mutt_usage (void)
  66. {
  67.   puts ("Usage:\n\
  68. mutt [ -nzZ ] [ -F <muttrc> ] [ -m <type> ] [ -f <mailbox> ]\n\
  69. mutt [ -nx ] [ -a <file> ] [ -F <muttrc> ] [ -H <file> ] [ -i <file> ] [ -s <subj> ] [ -b <addr> ] [ -c <addr> ] <addr> [ ... ]\n\
  70. mutt [ -n ] [ -F <muttrc> ] -p\n\
  71. mutt -v\n\
  72. \n\
  73. -a <file>\tattach a file to the message\n\
  74. -b <address>\tspecify a blind carbon-copy (BCC) address\n\
  75. -c <address>\tspecify a carbon-copy (CC) address\n\
  76. -f <mailbox>\tspecify which mailbox to read\n\
  77. -F <muttrc>\tspecify an alternate muttrc file\n\
  78. -H <file>\tspecify a draft file to read header from\n\
  79. -i <file>\tspecify a file which Mutt should include in the reply\n\
  80. -m <type>\tspecify a default mailbox type\n\
  81. -n\t\tcauses Mutt not to read the system Muttrc\n\
  82. -p\t\trecall a postponed message\n\
  83. -R\t\topen mailbox in read-only mode\n\
  84. -s <subj>\tspecify a subject (must be in quotes if it has spaces)\n\
  85. -v\t\tshow version and compile-time definitions\n\
  86. -x\t\tsimulate the mailx send mode\n\
  87. -y\t\tselect a mailbox specified in your `mailboxes' list\n\
  88. -z\t\texit immediately if there are no messages in the mailbox\n\
  89. -Z\t\topen the first folder with new message, exit immediately if none\n\
  90. -h\t\tthis help message");
  91.  
  92.   exit (0);
  93. }
  94.  
  95. static void show_version (void)
  96. {
  97.   struct utsname uts;
  98.  
  99.   printf ("Mutt %s, ", VERSION);
  100.   puts (Notice);
  101.  
  102.   uname (&uts);
  103.  
  104. #ifdef _AIX
  105.   printf ("System info: %s %s.%s", uts.sysname, uts.version, uts.release);
  106. #elif defined (SCO)
  107.   printf ("System info: SCO %s", uts.release);
  108. #else
  109.   printf ("System info: %s %s", uts.sysname, uts.release);
  110. #endif
  111.  
  112. #ifdef NCURSES_VERSION
  113.   printf (" [using ncurses %s]", NCURSES_VERSION);
  114. #elif defined(USE_SLANG_CURSES)
  115.   printf (" [using slang %d]", SLANG_VERSION);
  116. #endif
  117.  
  118.   puts ("\n\nCompile time definitions:");
  119.  
  120. #ifdef DOMAIN
  121.   printf ("DOMAIN=\"%s\"\n", DOMAIN);
  122. #else
  123.   puts ("-DOMAIN");
  124. #endif
  125.  
  126. #ifdef HIDDEN_HOST
  127.   fputs ("+HIDDEN_HOST  ", stdout);
  128. #else
  129.   fputs ("-HIDDEN_HOST  ", stdout);
  130. #endif
  131.  
  132. #ifdef HOMESPOOL
  133.   fputs ("+HOMESPOOL  ", stdout);
  134. #else
  135.   fputs ("-HOMESPOOL  ", stdout);
  136. #endif
  137.  
  138. #ifdef USE_SETGID
  139.   fputs ("+USE_SETGID  ", stdout);
  140. #else
  141.   fputs ("-USE_SETGID  ", stdout);
  142. #endif
  143.  
  144. #ifdef USE_DOTLOCK
  145.   fputs ("+USE_DOTLOCK  ", stdout);
  146. #else
  147.   fputs ("-USE_DOTLOCK  ", stdout);
  148. #endif
  149.  
  150. #ifdef USE_FCNTL
  151.   fputs ("+USE_FCNTL  ", stdout);
  152. #else
  153.   fputs ("-USE_FCNTL  ", stdout);
  154. #endif
  155.  
  156. #ifdef USE_FLOCK
  157.   puts ("+USE_FLOCK");
  158. #else
  159.   puts ("-USE_FLOCK");
  160. #endif
  161.  
  162. #ifdef USE_POP
  163.   fputs ("+USE_POP  ", stdout);
  164. #else
  165.   fputs ("-USE_POP  ", stdout);
  166. #endif
  167.  
  168. #ifdef HAVE_REGCOMP
  169.   fputs ("+HAVE_REGCOMP  ", stdout);
  170. #else
  171.   fputs ("-HAVE_REGCOMP  ", stdout);
  172. #endif
  173.  
  174. #ifdef USE_GNU_RX
  175.   fputs ("+USE_GNU_RX  ", stdout);
  176. #else
  177.   fputs ("-USE_GNU_RX  ", stdout);
  178. #endif
  179.  
  180. #ifdef HAVE_COLOR
  181.   fputs ("+HAVE_COLOR  ", stdout);
  182. #else
  183.   fputs ("-HAVE_COLOR  ", stdout);
  184. #endif
  185.  
  186. #ifdef _PGPPATH
  187. #ifdef HAVE_PGP5
  188.   fputs ("+HAVE_PGP5  ", stdout);
  189. #endif
  190. #endif
  191.  
  192. #ifdef BUFFY_SIZE
  193.   puts ("+BUFFY_SIZE");
  194. #else
  195.   puts ("-BUFFY_SIZE");
  196. #endif
  197.  
  198.   printf ("SENDMAIL=\"%s\"\n", SENDMAIL);
  199.   printf ("MAILPATH=\"%s\"\n", MAILPATH);
  200.   printf ("SHAREDIR=\"%s\"\n", SHAREDIR);
  201.  
  202. #ifdef ISPELL
  203.   printf ("ISPELL=\"%s\"\n", ISPELL);
  204. #else
  205.   puts ("-ISPELL");
  206. #endif
  207.  
  208. #ifdef _PGPPATH
  209.   printf ("_PGPPATH=\"%s\"\n", _PGPPATH);
  210. #endif
  211.  
  212.   exit (0);
  213. }
  214.  
  215. static void start_curses (void)
  216. {
  217.   km_init (); /* must come before mutt_init */
  218.  
  219. #ifdef USE_SLANG_CURSES
  220.   SLtt_Ignore_Beep = 1; /* don't do that #*$@^! annoying visual beep! */
  221.   SLsmg_Display_Eight_Bit = 128; /* characters above this are printable */
  222. #endif
  223.   if (initscr () == NULL)
  224.   {
  225.     puts ("Error initializing terminal.");
  226.     exit (1);
  227.   }
  228.   ci_start_color ();
  229.   keypad (stdscr, TRUE);
  230.   cbreak ();
  231.   noecho ();
  232. #if HAVE_TYPEAHEAD
  233.   typeahead (-1);       /* simulate smooth scrolling */
  234. #endif
  235.   mutt_signal_init ();
  236. #if HAVE_META
  237.   meta (stdscr, TRUE);
  238. #endif
  239. }
  240.  
  241. #define M_IGNORE  (1<<0)    /* -z */
  242. #define M_BUFFY   (1<<1)    /* -Z */
  243. #define M_NOSYSRC (1<<2)    /* -n */
  244. #define M_RO      (1<<3)    /* -R */
  245. #define M_SELECT  (1<<4)    /* -y */
  246.  
  247. int main (int argc, char **argv)
  248. {
  249.   char folder[_POSIX_PATH_MAX] = "";
  250.   char *subject = NULL;
  251.   char *includeFile = NULL;
  252.   char *draftFile = NULL;
  253.   char *newMagic = NULL;
  254.   HEADER *msg = NULL;
  255.   LIST *attach = NULL;
  256.   int sendflags = 0;
  257.   int flags = 0;
  258.   int version = 0;
  259.   int i;
  260.   extern char *optarg;
  261.   extern int optind;
  262.  
  263.   SRAND (time (NULL));
  264.   setlocale (LC_CTYPE, "");
  265.   umask (077);
  266.  
  267. #ifdef USE_SETGID
  268.   /* Determine the user's default gid and the gid to use for locking the spool
  269.    * mailbox on those systems which require setgid "mail" to write to the
  270.    * directory.  This function also resets the gid to "normal" since the
  271.    * effective gid will be "mail" when we start (Mutt attempts to run
  272.    * non-setgid whenever possible to reduce the possibility of security holes).
  273.    */
  274.  
  275.   /* Get the default gid for the user */
  276.   UserGid = getgid ();
  277.  
  278.   /* it is assumed that we are setgid to the correct gid to begin with */
  279.   MailGid = getegid ();
  280.  
  281.   /* reset the effective gid to the normal gid */
  282.   if (SETEGID (UserGid) != 0)
  283.   {
  284.     perror ("setegid");
  285.     exit (0);
  286.   }
  287. #endif
  288.  
  289.   memset (Options, 0, sizeof (Options));
  290.  
  291.   while ((i = getopt (argc, argv, "a:b:F:f:c:d:H:s:i:hm:npRvxyzZ")) != EOF)
  292.     switch (i)
  293.     {
  294.       case 'a':
  295.     {
  296.       LIST *t;
  297.  
  298.       t = attach;
  299.       while (t && t->next)
  300.         t = t->next;
  301.       if (t)
  302.       {
  303.         t->next = mutt_new_list ();
  304.         t = t->next;
  305.       }
  306.       else
  307.         attach = t = mutt_new_list ();
  308.       t->data = safe_strdup (optarg);
  309.     }
  310.     break;
  311.  
  312.       case 'F':
  313.  
  314.     strfcpy (Muttrc, optarg, sizeof (Muttrc));
  315.     break;
  316.  
  317.       case 'f':
  318.  
  319.     strfcpy (folder, optarg, sizeof (folder));
  320.     break;
  321.  
  322.       case 'b':
  323.       case 'c':
  324.  
  325.     if (!msg)
  326.       msg = mutt_new_header ();
  327.     if (!msg->env)
  328.       msg->env = mutt_new_envelope ();
  329.     rfc822_parse_adrlist (i == 'b' ? &msg->env->bcc : &msg->env->cc,
  330.                   o